#!/bin/bash
#*******************************************************************
# ݲòƲ
#*******************************************************************
#$1: config file name, like: plugin.config(format: ini)
#$2: package directory, like: /disk1/ap135/torchlight/bin/ar71xx/packages
#$3: plugin directory, like: /disk1/ap135/torchlight/plugin
#$4: plugin tool's parent path, like: /disk1/ap135/torchlight/staging_dir/host/bin
#$5: ipkg-tar path, like: /disk1/ap135/torchlight/scripts/ipkg-tar
#$6: plugin name, like: dmz
#*******************************************************************

CONFIG_FILE=$1
PKG_DIR=$2
PLUGIN_DIR=$3
PACK_PLUGIN_PROG=$4/pack-plugin
PACK_IPKS_PROG=$4/make-plugin
IPKG_TAR_SCRIPT=$5/ipkg-tar
PLUGIN_NAME=$6

PLUGIN_CONFIG="plugin.config"
IPK_DIR="IPKS"
PRE_STORED_PLUGIN_LIST_FILE="plugin.pre"
FACTORY_CONFIG="factory.config"

total_size=0
conponents=
md5=

# scan ipk dir, stat total installed-size, and log all names of ipk
scan_ipks()
{
	local comp_dir="$1"
	local ipks=`ls $comp_dir/ | grep .ipk`
	local pkg
	local size
	local name

	for pkg in $ipks;do
		if [ -d $pkg ];then
			:
		else
			size=`$IPKG_TAR_SCRIPT $comp_dir/$pkg ./control.tar.gz | tar xzOf - ./control | grep "Installed-Size" | cut -d" " -f2`
			let "total_size += $size"
			
			name=`$IPKG_TAR_SCRIPT $comp_dir/$pkg ./control.tar.gz | tar xzOf - ./control | grep "Package" | cut -d" " -f2`
			conponents="$conponents $name"
		fi
	done
}

# pack all ipks to a single data file
pack_ipks()
{
	$PACK_IPKS_PROG -t 0 -d "$1" -f "$2"
}

# check integrity of PLUGININFO file
check_integrity()
{
	:
}

calc_md5()
{
	md5=`md5sum -b "$1" | cut -d " " -f1`
}

# set plugin_id/size/md5/components
render_plugin_info()
{
	echo "plugin_id is $1"
	sed -i -e "s/^plugin_id:.*/plugin_id:$1/" "$2"
	sed -i -e "s/^size:.*/size:$total_size/" "$2"
	sed -i -e "s/^md5:.*/md5:$md5/" "$2"
	sed -i -e "s/^components:.*/components:$conponents/" "$2"
}

build_plugin()
{
	local section=$1
	local configfile=$2
	local parts_dir
	local plugin_id
	local plugin_version
	local plugin_name
	local plugin_size
	local plugin_tag
	local plugin_components
	local plugin_author
	local plugin_weburi
	local plugin_webicon
	local plugin_appicon
	local plugin_appzip
	local plugin_bin
	local date_now=`date "+%y%m%d"`
	local release_time=`date "+%Y-%m-%d %H:%M:%S"`
	
	for key in id version name size tag components author weburi webicon appicon appzip bin
	do
		plugin_key="plugin_$key"
		plugin_val=$(awk -F '=' '/\['"$section"'\]/{a=1}a==1&&$1~/'"plugin_$key"'/{gsub(/[[:blank:]]*/,"",$2);print $2;exit}' $configfile)

		case $key in
			id)
				plugin_id="$plugin_val"
				echo $plugin_id >> ${PLUGIN_DIR}/${PRE_STORED_PLUGIN_LIST_FILE}
			;;
			version)
				plugin_version="$plugin_val"
			;;
			name)
				plugin_name="$plugin_val"
			;;
			size)
				plugin_size="$plugin_val"
			;;
			tag)
				plugin_tag="$plugin_val"
			;;
			components)
				plugin_components="$plugin_val"
			;;
			author)
				plugin_author="$plugin_val"
			;;
			weburi)
				plugin_weburi="$plugin_val"
			;;
			webicon)
				plugin_webicon="$plugin_val"
			;;
			appicon)
				plugin_appicon="$plugin_val"
			;;
			appzip)
				plugin_appzip="$plugin_val"
			;;
			bin)
				plugin_bin="$plugin_val"
			;;
		esac
		
#		echo "plugin_$key is ${plugin_val}"
	done

	echo "components is $plugin_components"
#	plugin_components=${plugin_components//","/" "}	
	plugin_components=`echo $plugin_components | sed 's/,/ /g'`
	
	local components_path=${PLUGIN_DIR}/${section}_${plugin_id}/${IPK_DIR}/
	local ipks_data=${PLUGIN_DIR}/${section}_${plugin_id}/${plugin_id}.data
#	local plugin_info=${PLUGIN_DIR}/${section}_${plugin_id}/${plugin_id}.info
	
	for ipk in $plugin_components; do
		echo ${PKG_DIR}/${ipk}*.ipk ${components_path}
		cp ${PKG_DIR}/${ipk}_*.ipk ${components_path} 
	done
	
	parts_dir="${PLUGIN_DIR}/${section}_${plugin_id}"

	# pack ipks
#	check_integrity
#	scan_ipks ${components_path}
	pack_ipks ${components_path} ${ipks_data}
#	calc_md5 ${ipks_data}
#	render_plugin_info ${plugin_id} ${plugin_info}

	# pack plugin
	${PACK_PLUGIN_PROG} -i "$plugin_id" -v "$plugin_version" -n "$plugin_name" -s "$plugin_size" -t "$plugin_tag" -c "$plugin_components" \
				-a "$plugin_author" -o "SLP" -d "$parts_dir/$plugin_id.data" -x "$parts_dir/$plugin_webicon" -y "$parts_dir/$plugin_appicon" \
				-z "$parts_dir/$plugin_appzip" -p "$parts_dir/${section}_${plugin_id}_${plugin_version}_${date_now}.bin"
	
	# isolate ipks with comma, but not space
	plugin_components=`echo $plugin_components | sed 's/ /,/g'`	
	
	# generate factory config info
	cat <<EOF > $parts_dir/${FACTORY_CONFIG}

config plugin_info '$plugin_id'
        option name '$plugin_name'
        option version '$plugin_version'
        option size '$plugin_size'
        option author '$plugin_author'
        option tag '$plugin_tag'
        option update_log 'null'
        option data_url '/data/plugin/${section}_${plugin_id}_${plugin_version}_${date_now}.bin'
        option release_time '$release_time'
        option components '$plugin_components'
        option local_app_icon_url '/web-static/plugin/${plugin_id}/${plugin_appicon}'
        option local_webzip_url '/web-static/plugin/${plugin_id}/${plugin_appzip}'
        option icon_url '/web-static/plugin/${plugin_id}/${plugin_webicon}'
        option property '0'
        option can_update '0'
        option opera_type '0'
        option uri '${plugin_weburi}'                                                                                           
EOF
}

plugin_init()
{
	rm -rf ${PLUGIN_DIR}/${PRE_STORED_PLUGIN_LIST_FILE}
}

plugin_exit()
{
	local plugin_id
	
	while read plugin_id
	do
		echo "plugin_id is: $plugin_id"
		rm -rf ${PLUGIN_DIR}/${plugin_id}/${plugin_id}.data
		rm -rf ${PLUGIN_DIR}/${plugin_id}/${IPK_DIR}/*.ipk
	done < ${PLUGIN_DIR}/${PRE_STORED_PLUGIN_LIST_FILE}
}

#plugin_init

echo "ipkg-buildplugin $1 $2 $3 $4 $5 $6"
build_plugin  ${PLUGIN_NAME}  ${CONFIG_FILE}
#plugin_exit
